/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Principal;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.*;



/**
 *
 * @author Borja
 */
public class Tienda {
    private Connection conn;
    static private Tienda instancia = null;
    
    static public Tienda getInstancia(DataSource ds) {

        if (instancia == null) {
            instancia = new Tienda(ds);
        }
        return instancia;
    }
    
    private Tienda(DataSource ds) {
        try {
            conn = ds.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("Error en la base de datos",e);
        }
    }

    public void close() {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                System.err.println("Error al cerrar la conexión: " + e.getMessage());
            }
        }
    } 
    public String [] getUsuario(String idUser,String password){
        String usuario []={"",""};
        Statement stm = null;
        ResultSet rs = null;
        
        try {
            String sentencia = "SELECT * FROM BFERNANDEZO.USUARIOS WHERE UPPER(IDUSER) = '" + idUser.toUpperCase()+"' and PASSWORD = '"+password+"'";
            stm = conn.createStatement();
            rs = stm.executeQuery(sentencia);

            if (rs.next()) {
                usuario[0]= rs.getString("IDUSER");
                usuario[1]= rs.getString("PASSWORD");
            }else{
                usuario[0]= null;
                usuario[1]= null;
            }
            rs.close();
        } catch (SQLException e) {
            throw new RuntimeException("Error al realizar la consulta",e);
        } finally {
            try {
                stm.close();
            } catch (SQLException e) {
                System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
            }
        }
           //System.out.println(sentencia);
           
        return usuario;
    }

     public void añadirProducto(Producto producto){
        Statement stm = null;
        try {
            String sentencia= "INSERT INTO PRODUCTOS VALUES (" + producto.getIdProducto()
                    + "," + producto.getIdFamilia() 
                    + ",'" + producto.getNombre() + "'"
                    + ",'" + producto.getDescripcion() + "'" 
                    + "," + producto.getPrecio() 
                    + "," + producto.getStock() 
                    + ",'" + producto.getFecha_Alta() + "'"
                    + ",'images/" + producto.getImagen() + "'"
                    + ")";
            stm = conn.createStatement();
            stm.executeUpdate(sentencia);

        } catch (SQLException e) {
            throw new RuntimeException("Error al realizar la consulta",e);
        } finally {
            try {
                stm.close();
            } catch (SQLException e) {
                System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
            }
        }
      
     }
     
     public void modificarProducto(Producto producto){
        Statement stm = null;
        try {
            String sentencia= "UPDATE PRODUCTOS SET IDPRODUCTO = " + producto.getIdProducto()
                    + ",IDFAMILIA = " + producto.getIdFamilia() 
                    + ",NOMBRE = '" + producto.getNombre() + "'"
                    + ",DESCRIPTCION = '" + producto.getDescripcion() + "'" 
                    + ",PRECIO = " + producto.getPrecio() 
                    + ",STOCK = " + producto.getStock() 
                    + ",FECHA_ALTA = '" + producto.getFecha_Alta() + "'"
                    + ",IMAGEN = 'images/" + producto.getImagen() + "'"
                    + " WHERE IDPRODUCTO = "+producto.getIdProducto() +" AND IDFAMILIA = " + producto.getIdFamilia();
            stm = conn.createStatement();
            stm.executeUpdate(sentencia);

        } catch (SQLException e) {
            throw new RuntimeException("Error al realizar la consulta",e);
        } finally {
            try {
                stm.close();
            } catch (SQLException e) {
                System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
            }
        }
      
     }
     
     public void marcarEntregado(int idPedido){
        Statement stm = null;
        try {
            String sentencia= "UPDATE PEDIDOS SET ENTREGADO = 1 WHERE IDPEDIDO = "+ idPedido;
            System.err.println(sentencia);
            stm = conn.createStatement();
            stm.executeUpdate(sentencia);

        } catch (SQLException e) {
            throw new RuntimeException("Error al realizar la consulta",e);
        } finally {
            try {
                stm.close();
            } catch (SQLException e) {
                System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
            }
        }
      
     }
     
    public Producto recogerProductoPorId(int idPrd, int familia) throws SQLException{
         Producto producto[] = null;
         String sentencia = "SELECT * FROM BFERNANDEZO.PRODUCTOS WHERE idProducto = " + idPrd + " and idFamilia =" + familia;
         producto = recuperarProductosDB(sentencia);
         return producto[0];
     }
     
    public Producto[] recogerProductoPorId(int[] idPrd, int familia) throws SQLException{
         Producto producto[] = null;
         String sentencia = "SELECT * FROM BFERNANDEZO.PRODUCTOS WHERE idProducto like(";
         for (int i: idPrd){
             sentencia += String.valueOf(i);
             sentencia += ",";
         }
         if (sentencia.lastIndexOf(",")==sentencia.length()-1)
             sentencia = sentencia.substring(1,sentencia.length()-1);
         sentencia += ") and idFamilia =" + familia;
         producto = recuperarProductosDB(sentencia);
         return producto;
     }
     
    public Producto[] recogerProductoPorCategoria(int idFamilia) throws SQLException{
         Producto productos[] = null;
         String sentencia = "SELECT * FROM BFERNANDEZO.PRODUCTOS WHERE IDFAMILIA = " + idFamilia;
         productos = recuperarProductosDB(sentencia);
         return productos;
     }
    public Producto[] recogerProductoPorNombre(String nombre) throws SQLException{
         Producto productos[] = null;
         String sentencia = "SELECT * FROM BFERNANDEZO.PRODUCTOS WHERE UPPER(NOMBRE) like ('" + nombre.toUpperCase()+"')";
         productos = recuperarProductosDB(sentencia);
         return productos;
     }
    
    public Producto[] recogerProductoPorPrecio(float precio, String operacion ) throws SQLException{
         Producto productos[] = null;         
         String sentencia = "SELECT * FROM BFERNANDEZO.PRODUCTOS WHERE PRECIO " + operacion + " " + precio;
         productos = recuperarProductosDB(sentencia);
         return productos;
     }
    private /*Object[]*/Producto[] recuperarProductosDB(String sentencia){
        Statement stm = null;
        ArrayList  lista = new ArrayList();
        Producto[] producto = null;
        ResultSet rs = null;
        try {
            stm = this.conn.createStatement();
            rs = stm.executeQuery(sentencia);
            while (rs.next()) {
                int     idProducto = rs.getInt("idProducto");
                int     idFamilia = rs.getInt("idFamilia");
                String  nombre = rs.getString("nombre");
                String  descriptcion = rs.getString("descriptcion");
                float   precio = rs.getFloat("precio");
                int     stock = rs.getInt("stock");            
                Date    Fecha_Alta = rs.getDate("Fecha_Alta");
                String  imagen = rs.getString("imagen");
                
                try{
                    lista.add(new Producto(idProducto,idFamilia,nombre,descriptcion,precio,stock,Fecha_Alta,imagen));
                }catch(Exception e1){System.out.println("Error");}

           /* producto = new Producto(idProducto,idFamilia,nombre,descriptcion,precio,stock,Fecha_Alta,imagen);*/
            }
            
            producto = new Producto[lista.size()];
            int contador = 0;
            for (Object p:lista){
                producto[contador] = (Producto)p;
                contador ++;
            }
          rs.close();
          return producto;


        } catch (SQLException e) {
            throw new RuntimeException("Error al realizar la consulta",e);
        } finally {
            try {
                stm.close();
            } catch (SQLException e) {
                System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
            }
        }
     }
     
    public void eliminarProducto(int idP, int idF){
             Statement stm = null;
        try {
            String sentencia= "DELETE FROM PRODUCTOS WHERE IDPRODUCTO = " + idP + " AND IDFAMILIA = " + idF;
            stm = conn.createStatement();
            stm.executeUpdate(sentencia);
        } catch (SQLException e) {
            throw new RuntimeException("Error al eliminar la tupla",e);
        } 
      
  }
    public void realizarPedido(String nombre){
        Statement stm = null;
        Cesta cesta = Cesta.getInstancia();
        ArrayList<Producto> productos = cesta.getProductos();
        ArrayList<Integer> cantidad = cesta.getCantidad();

        try {
             ResultSet rs = null;
             int idPedido = recuperarPedidoMaximo();
            
            java.util.Calendar fecha = java.util.Calendar.getInstance();
            stm = null;
            String fecha1 = (fecha.get(java.util.Calendar.YEAR) + "/" + fecha.get(java.util.Calendar.MONTH)    + "/" + fecha.get(java.util.Calendar.DATE)).replaceAll("/", "-");
            for(Producto producto:productos){
                String sentencia= "INSERT INTO PEDIDOS VALUES ("+idPedido
                        +  "," + "'" + nombre 
                        + "'," + producto.getIdProducto()
                        + "," + producto.getIdFamilia()
                        + "," + cantidad.get(productos.indexOf(producto))
                        + ",0"
                        + ",'" + fecha1
                        + "',null)";
                System.err.println(sentencia);
                stm = conn.createStatement();
                stm.executeUpdate(sentencia);
            }
            cesta.removeProductos();
        } catch (SQLException e) {
            throw new RuntimeException("Error al eliminar la tupla",e);
        } 
        
    }
    
     public Pedido[] recogerPedidos() throws SQLException{
         Pedido[] pedido = null ;   
         int numPedidos = recuperarPedidoMaximo()-1;
         pedido = new Pedido[numPedidos];
         for (int i = 1; i <= numPedidos;i++){
            String sentencia = "SELECT * FROM BFERNANDEZO.PEDIDOS WHERE IDPEDIDO = " + i;
            pedido[i-1] = recuperarPedidoDB(sentencia, i); 
         }
         return pedido;
     }
     
     private int recuperarPedidoMaximo(){
        Statement stm = null;
        int idPedido = 1;
        try {
             ResultSet rs = null;
            
             stm = this.conn.createStatement();
             rs = stm.executeQuery("SELECT MAX(IDPEDIDO) FROM PEDIDOS");
             try{
                if (rs.next())
                    idPedido = rs.getInt("1") + 1;
                }catch(Exception e){}
            } catch (SQLException e) {                        
                throw new RuntimeException("Error al realizar la consulta",e);
            } finally {
                try {
                    stm.close();
                } catch (SQLException e) {
                    System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
                }
            }
     return idPedido;
     }
     
    public Pedido recogerPedido(int idPedido) throws SQLException{
         Pedido pedido;         
         String sentencia = "SELECT * FROM BFERNANDEZO.PEDIDOS WHERE IDPEDIDO = " + idPedido;
         pedido = recuperarPedidoDB(sentencia, idPedido);
         return pedido;
     }
    private Pedido recuperarPedidoDB(String sentencia, int idPedido){
        Statement stm = null;
        ArrayList<Productos_Aux>  lista = new ArrayList();
        ResultSet rs = null;
        Pedido pedido = null;
        
        try {
            stm = this.conn.createStatement();
            rs = stm.executeQuery(sentencia);
            while (rs.next()) {
                String  idUser = rs.getString("idUser");
                int     idProducto = rs.getInt("idProducto");
                int     idFamilia = rs.getInt("idFamilia");
                int     cantidad = rs.getInt("cantidad");
                int     entregado = rs.getInt("entregado");
                Date    Fecha_Pedido = rs.getDate("Fecha_Pedido");
                Date    Fecha_Entrega = rs.getDate("Fecha_Entrega");
                
                try{
                    Productos_Aux producto = new Productos_Aux(idProducto,idFamilia,cantidad);
                    lista.add(producto);
                }catch(Exception e1){System.out.println("Error");}
            pedido = new Pedido(idPedido, idUser, lista, cantidad, entregado, Fecha_Pedido, Fecha_Entrega);
           /* producto = new Producto(idProducto,idFamilia,nombre,descriptcion,precio,stock,Fecha_Alta,imagen);*/
            }
            
          rs.close();
          return pedido;
        } catch (SQLException e) {
            throw new RuntimeException("Error al realizar la consulta",e);
        } finally {
            try {
                stm.close();
            } catch (SQLException e) {
                System.err.println("Error al realizar la consulta: " + e.getLocalizedMessage());
            }
        }
     }
}
